package com.example.banner;

import org.springframework.boot.Banner;
import org.springframework.core.env.Environment;

import java.io.PrintStream;

/**
 * 自定义 Spring Boot Banner 实现类
 * 作用：完全替代 Spring Boot 默认 Banner，支持通过配置启用/禁用
 * 关键点：实现 Banner 接口，确保在应用启动初期、日志输出前被调用
 * 注意：此对象由 Spring Boot 自动配置机制注入，无需手动创建
 */
public class CustomBanner implements Banner {

    // 默认 Banner 文本（可配置）
    private final String bannerText;

    // 是否启用自定义 Banner（从配置读取）
    private final boolean enabled;

    /**
     * 构造函数：接收配置的 Banner 文本和启用状态
     *
     * @param bannerText 自定义 Banner 的文本内容（支持换行、ASCII 艺术字）
     * @param enabled    是否启用该自定义 Banner
     */
    public CustomBanner(String bannerText, boolean enabled) {
        this.bannerText = bannerText != null ? bannerText : getDefaultBannerText();
        this.enabled = enabled;
    }

    /**
     * 默认 Banner 文本（当用户未配置时使用）
     * 使用 ASCII 艺术字体，保持与 Spring Boot 风格一致的视觉效果
     * 注意：每行末尾不加 \n，由 Spring Boot 自动换行
     */
    private String getDefaultBannerText() {
        return """
                ██████╗ ███████╗ ██████╗ █████╗ ██████╗ ███████╗
                ██╔══██╗██╔════╝██╔════╝██╔══██╗██╔══██╗██╔════╝
                ██████╔╝█████╗  ██║     ███████║██████╔╝█████╗  
                ██╔══██╗██╔══╝  ██║     ██╔══██║██╔══██╗██╔══╝  
                ██║  ██║███████╗╚██████╗██║  ██║██║  ██║███████╗
                ╚═╝  ╚═╝╚══════╝ ╚═════╝╚═╝  ╚═╝╚═╝  ╚═╝╚══════╝
                
                :: Custom Spring Boot Banner :: (v1.0.0)
                """;
    }

    /**
     * 实现 Banner 接口的 printBanner 方法
     * 此方法由 Spring Boot 在启动早期自动调用（在日志系统初始化前）
     * 执行时机：ApplicationContext 初始化前，System.out 输出
     * 
     * @param environment Spring 环境变量（可用于读取配置）
     * @param sourceClass 启动类（可选，用于日志记录）
     * @param out         输出流（通常是 System.out）
     */
    @Override
    public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
        // 如果配置中禁用了自定义 Banner，则直接跳过，使用默认 Banner
        if (!enabled) {
            return; // 不输出任何内容，Spring Boot 将使用默认 Banner
        }

        // 输出自定义 Banner 内容
        // 注意：不要使用 logger，因为此时日志系统尚未初始化！必须使用 PrintStream
        out.println(bannerText);
    }
}